// 导入 数据库操作模块
const db = require('../db/index')
// 导入 加密 都用户提交的密码进行加密
const bcrypt = require('bcryptjs')
// 用这个包 生成 token  npm i jsonwebtoken
const jwt = require('jsonwebtoken')
// 导入配置文件
const config = require('../config')


// 注册新用户的处理函数
exports.regUser = (req, res) => {
  const userInfo = req.body
  console.log('userInfo', req.body)

  // 判断用户名是否被占用 查询 user 表中username=req.body.username 的数据
  const sqlStr = 'select * from user where username=?'
  db.query(sqlStr, userInfo.username, (err, results) => {
    // 判断 sql语句是否执行成功
    // if (err) return res.send({status: 1, message: err.message})
    if (err) return res.cc(err.message)
   
    //console.log(results)
    if (results.length > 0) {
      // return res.send({ status: 1, message: '用户名已被注册，请更换用户名'})
      return res.cc('用户名已被注册，请更换用户名')
    } 

    // 调用bcrypt.hashSync 对密码进行加密
    userInfo.password = bcrypt.hashSync(userInfo.password)
    
    // 插入行用户
    const sql = 'insert into user set ?'
    db.query(sql, {username: userInfo.username, password: userInfo.password, chineseName: userInfo.chineseName}, (err, results) => {
      // 判断 sql语句是否执行成功
      // if (err) return res.send({status: 1, message: err.message})
      if (err) return res.cc(err.message)
      
      // if (results.affectedRows !== 1) return res.send({status: 1, message: '注册用户失败，请稍后再试！'})
      if (results.affectedRows !== 1) return res.cc('注册用户失败，请稍后再试！')

      //console.log(bcrypt.hashSync(userInfo.password))
      // res.send({status: 200, message: '注册成功！'})
      res.cc('注册成功！', 200)
    })
    
  })

}

// 处理登录 的处理函数
exports.login = (req, res) => {
  const userInfo = req.body
  console.log(req.body)

  // 判断用户名是否已注册 查询 user 表中username=req.body.username 的数据
  const sql = 'select * from user where username=?'
  db.query(sql, userInfo.username, (err, results) => {
    // 判断 sql语句是否执行成功
    if (err) return res.cc(err.message)

    // console.log(results)
    // user表 中没有这个用户 没有注册
    if (results.length === 0) return res.cc('该用户未注册！')

    // 拿着用户输入的密码，和数据库的密码进行比对  bcrypt.compareSync比较密码是否一致 返回的是布尔值（true/一致，false/不一致）
    const compareResult = bcrypt.compareSync(userInfo.password, results[0].password)
    //compareResult = userInfo.password === results[0].password
    if (!compareResult) return res.cc('密码错误！')

    // 剔除敏感信息 password
    const user = {...results[0], password: '', isLogin: 1}

    // 生成token 字符串
    const tokenStr = jwt.sign(user, config.jwtSecretkey, {
      expiresIn: config.expiresIn
    })

   

    // 登录需要把 user表里的isLogin字段值变为1 好可以进行退出登录
    const str = 'update user set isLogin = ? where id = ?'
    db.query(str, [1, results[0].id], (err, results) => {
      // 判断 sql语句是否执行成功
      if (err) return res.cc(err.message)

      if (results.affectedRows !== 1) return res.cc('登录失败，请稍后再试！')

      res.send({
        status: 200,
        message: '登录成功！',
        data: {
          username: user.username,
          chineseName: user.chineseName
        },
        token: 'Bearer ' + tokenStr
      })
     
    })

   
  })
  
}
